// src/utils/fetchEventSource.js
import { fetchEventSource } from '@microsoft/fetch-event-source';
import { utilJs } from "@/utils/common.js";

class FetchEventSource {
  /**
   * 封装后的 SSE 请求方法
   * @param {string} url 请求地址
   * @param {Object} options 配置项
   * @param {Object} options.headers 请求头
   * @param {string} options.method 请求方法 (默认 GET)
   * @param {Object} options.body 请求体
   * @param {AbortController} options.controller 中断控制器
   * @param {function} options.onopen 连接打开回调
   * @param {function} options.onmessage 消息接收回调
   * @param {function} options.onerror 错误回调
   * @param {function} options.onclose 关闭回调
   */
  static request(url, { // 不需要 new FetchEventSource() 创建实例，直接通过类名调用
    headers = {},
    method = 'GET',
    body,
    onopen,
    onmessage,
    onerror,
    onclose,
    controller
  }) {
    try {
      fetchEventSource(url, {
        method,
        headers: {
          'Content-Type': 'application/json',
          'Authorization': 'Bearer ' + localStorage.getItem("token"),
          'X-STORE-ID':  utilJs.getStoreId(),
          ...headers
        },
        body: body ? JSON.stringify(body) : {},
        signal: controller && controller.signal,
        openWhenHidden: true,
        onopen(response) {
          if (response.ok) {
            if (onopen) onopen(response)
          } else {
            throw new Error(`SSE连接失败: ${response.status}`);
          }
        },
        onmessage(event) {
          try {
            const data = event.data && JSON.parse(event.data);
            if (onmessage && data) onmessage(data, event)
            if (!data) onerror();
          } catch (e) {
            if (onerror) onerror(e);
          }
        },
        onerror(err) {
          if (onerror) onerror(err);
          throw err; // 抛出错误以便外层捕获
        },
        onclose() {
          if (onclose) onclose();
        }
      });
    } catch (err) {
      if (err.name !== 'AbortError') {
        console.error('SSE请求异常:', err);
        if (onerror) onerror(err);
      }
    }
  }
}

export default FetchEventSource;